package com.hns.tool.task.taque;

/**
 * 待执行的任务
 * @author:wucx
 * @email:zhuangcaijin@126.com
 * @version Revision 2.0.0
 */
public abstract class Task implements Comparable<Task>{

	State state = State.Ready;
	long startTime;
	long endTime;
	Priority priority = Priority.Normal;
	private long maxRunTime = 300*1000l; //默认最长的任务执行时间为300秒
	protected Object result = null;
	
	/**
	 * 取得任务执行状态
	 * @return 任务状态
	 * @author:wucx
	 * @email:zhuangcaijin@126.com
	 */
	public State getState() {
		return state;
	}
	
	/**
	 * 取得任务执行结果
	 * @return 执行结果
	 * @author:wucx
	 * @email:zhuangcaijin@126.com
	 */
	public Object getResult() {
		return result;
	}
	
	/**
	 * 设置任务执行超时时间
	 * @param second 时间
	 * @author:wucx
	 * @email:zhuangcaijin@126.com
	 */
	public void setTimeout(int second) {
		this.maxRunTime = second * 1000l;
	}
	
	/**
	 * 设置优先级
	 * @param priority 优先级
	 * @author:wucx
	 * @email:zhuangcaijin@126.com
	 */
	public void setPriority(Priority priority) {
		this.priority = priority;
	}
	
	/**
	 * 比较优先级
	 * @email:zhuangcaijin@126.com
	 */
	public int compareTo(Task o) {
		return priority.compareTo(o.priority);
	}
	
	/**
	 * 执行任务的主体逻辑
	 * @author:wucx
	 * @email:zhuangcaijin@126.com
	 */
	protected abstract void execute();
	
	/**
	 * 取消执行，打断超时的执行
	 * @author:wucx
	 * @email:zhuangcaijin@126.com
	 */
	protected abstract void cancel();
	
	/**
	 * 任务执行完成（即使执行异常）后触发的动作
	 * @author:wucx
	 * @email:zhuangcaijin@126.com
	 */
	protected abstract void end();
	
	/**
	 * 任务开始执行时调用
	 * @author:wucx
	 * @email:zhuangcaijin@126.com
	 */
	protected void prepare() {
		state = State.Running;
		startTime = System.currentTimeMillis();
	}
	
	/**
	 * 判断是否已经执行超时了
	 * @return 是否超时
	 * @author:wucx
	 * @email:zhuangcaijin@126.com
	 */
	boolean isTimeout() {
		if ( state == State.Running ) {
			return maxRunTime > 0 ? (System.currentTimeMillis() - startTime > maxRunTime) : false;
		}
		return false;
	}
	
	/**
	 * 优先权
	 * @author:wucx
	 * @email:zhuangcaijin@126.com
	 * @version Revision 2.0.0
	 */
	public enum Priority {
		Highest,High ,Normal,Low,Lowest ;
	}
	
	/**
	 * 任务状态：待执行，执行中，执行成功，忽略（已存在相同的任务），执行错误
	 * @author:wucx
	 * @email:zhuangcaijin@126.com
	 * @version Revision 2.0.0
	 */
	public enum State {
		Ready, Running, Done, Ignore, Error, Cancel
	}
}
